/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pooproj.regra;

import java.util.ArrayList;
import pooproj.basica.Filme;
import pooproj.erro.AllgemeinException;
import pooproj.erro.ConexaoException;
import pooproj.erro.ConsultaException;
import pooproj.repositorio.RepositorioFilme;
import pooproj.repositorio.RepositorioFilmeImpl;

/**
 *
 * @author Daniella
 */
public class RNFilme {
    
    private RepositorioFilme rep;
    
    public RNFilme(){
        rep = new RepositorioFilmeImpl();
    }
    
    /**
     * Para função de inserir novo Filme
     * Valida se nome foi preenchido corretamente
     * @param f
     * @throws AllgemeinException
     */
    public void valida(Filme f) throws AllgemeinException{
        if(f.getValido()!=null){
            throw new AllgemeinException("emptyfield",f.getValido());
        }
        
        if(f.getNomeFilme().trim().length()<3){
            throw new AllgemeinException("invalidvalue");
        }
    }
    
    /**
     * Para função de inserir novo Filme
     * Verifica se registro já existe
     * Utiliza método self consulta()
     * @param f
     * @throws AllgemeinException
     */
    public void verificaRedundancia(Filme f) throws AllgemeinException{
        if(consulta(f.getNomeFilme())!=null){
            throw new AllgemeinException("taken");
        }
    }
    
    /**
     * Para função de inserir novo Filme
     * inclui registro Filme
     * @param f
     * @throws AllgemeinException
     */
    public void cadastra(Filme f) throws AllgemeinException{
        try{
            rep.inserir(f);
        } catch (ConexaoException | ConsultaException e){
            throw new AllgemeinException("database"); 
        }
    }
    
    /**
     * Verifica se Filme informado existe no BD
     * Auxilia a utilização de alguns dos demais métodos
     * @param f
     * @throws AllgemeinException
     */
    public void verificaExiste(Filme f) throws AllgemeinException{
        if(consulta(f.getCodFilme())==null){
            throw new AllgemeinException("notfound");
        }
    }
    
    /**
     * Para função de consulta Filme
     * Varre registros e retorna Filme
     * @param nome
     * @return Filme
     * @throws AllgemeinException
     */
    public Filme consulta(String nome) throws AllgemeinException{
        Filme f;
        try{
            f = rep.consultar(nome); 
        } catch (ConexaoException | ConsultaException e){
            throw new AllgemeinException("database");
        }
        return f;
    }
    
    /**
     * Para função de consulta Filme
     * Varre registros e retorna Filme
     * @param id
     * @return Filme
     * @throws AllgemeinException
     */
    public Filme consulta(int id) throws AllgemeinException{
        Filme f;
        try{
            f = rep.consultar(id); 
        } catch (ConexaoException | ConsultaException e){
            throw new AllgemeinException("database");
        }
        return f;
    }
    
    /**
     * Para função de atualizar Filme
     * @param f
     * @throws AllgemeinException
     */
    public void altera(Filme f) throws AllgemeinException{
        try{
            rep.alterar(f);
        } catch (ConexaoException | ConsultaException e){
            throw new AllgemeinException("database");
        }
    }
    
    /**
     * Para função de gerar lista de Filme
     * @return list
     * @throws AllgemeinException
     */
    public ArrayList<Filme> lista() throws AllgemeinException{
        ArrayList<Filme> list;
        try{
            list = rep.listar();
            
        } catch (ConexaoException | ConsultaException e){
            throw new AllgemeinException("database");
        }
        return list;
    }
    
    /**
     * Para função excluir cadastro de Filme
     * @param f
     * @throws AllgemeinException
     */
    public void exclui(Filme f) throws AllgemeinException{
        try{
            rep.excluir(f);
        } catch (ConexaoException | ConsultaException e){
            throw new AllgemeinException("database");
        }
    }
}
